package 链表;

import java.util.List;

/**
 * https://leetcode-cn.com/leetbook/read/linked-list/fv6w7/
 *
 * 给你两个非空 的链表，表示两个非负的整数。它们每位数字都是按照逆序的方式存储的，并且每个节点只能存储一位 字。
 *
 * 请你将两个数相加，并以相同形式返回一个表示和的链表。
 *
 * 你可以假设除了数字 0 之外，这两个数都不会以 0开头。
 *
 */
public class 两数相加 {
    public class ListNode {
        int val;
        ListNode next;
        ListNode(int x) {
            val = x;
            next = null;
        }
    }

    /*
        因为两个链表都是逆序的，所以可以直接遍历这两个链表，逐位相加。
        设两个链表当前位置的数字为 x，y，进位值为 carry，和为 sum，
        则 sum = x + y + carry，新的进位值 carry = sum / 10，
        答案链表相应位置的数字为 sum % 10。如果两个链表的长度不同，就在短链表的末尾补0。

     */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode newHead = new ListNode(0);
        ListNode tmp = newHead;
        int carry = 0; //进位值
        while(l1!=null || l2 !=null || carry>0){ //carry>0保证相加后右进位，但是链表此时为空
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;
            int sum = x+y+carry; //拿到两个节点上相加后的值
            carry = sum / 10; //拿到进位的值
            tmp.next = new ListNode(sum%10);
            tmp = tmp.next;
            if(l1!=null){
                l1 = l1.next;
            }
            if(l2!=null){
                l2 = l2.next;
            }
        }
        return newHead.next;
    }
}
